// Scala中的特征
trait MyTrait1 {
  /**
   * 在Scala的特征中可以定义属性、方法
   * 方法可以是抽象的也可以是具体的
   * 结合了Java中的抽象类以及接口这两者的优点
   * 即：可以在特种中定义属性、抽象的方法、具体的方法，也可以同时实现多个特征
   */
  // 定义属性
  val i: Int = 10

  // 定义抽象的方法
  def isEqual(int: Int): Boolean

  // 定义具体的方法
  def isNotEqual(int: Int): Boolean = {
    !isEqual(int)
  }

  def printHello(): Unit = {
    println("Hello")
  }
}

trait MyTrait2 {
  /**
   * 在Scala的特征中可以定义属性、方法
   * 方法可以是抽象的也可以是具体的
   * 结合了Java中的抽象类以及接口这两者的优点
   * 即：可以在特种中定义属性、抽象的方法、具体的方法，也可以同时实现多个特征
   */
  // 定义属性
  val i2: Int = 20

  // 定义抽象的方法
  def isEqual2(int: Int): Boolean

  // 定义具体的方法
  def isNotEqual2(int: Int): Boolean = {
    !isEqual2(int)
  }

  def printHello2(): Unit = {
    println("Hello")
  }
}

class Q(qId: Int, name: String, age: String) extends Person(name, age) with MyTrait1 with MyTrait2 {
  val _qId: Int = qId

  // 实现特征中的抽象的方法
  override def isEqual(int: Int): Boolean = {
    _qId == int
  }

  override def isEqual2(int: Int): Boolean = {
    _qId == int
  }
}


object Demo18Trait {
  def main(args: Array[String]): Unit = {
    val q1: Q = new Q(10, "张三", "23")

    println(q1.i)
    println(q1.i2)

    println(q1._name)
    println(q1._age)

    q1.printHello()
    q1.printHello2()

    println(q1.isEqual(10))
    println(q1.isEqual(20))
    println(q1.isNotEqual(10))
    println(q1.isNotEqual(20))

    println(q1.isEqual2(10))
    println(q1.isEqual2(20))
    println(q1.isNotEqual2(10))
    println(q1.isNotEqual2(20))
  }

}